package com.example.express_order.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

/**
 * jwt令牌配置
 */
@Configuration
public class TokenConfig {

    //密钥串
    private final String SIGNING_KEY="auth123";
    @Bean
    public TokenStore tokenStore(){

        /**
         * jwt令牌存储方案
         * tokenStore默认有三种实现，分别是InMemoryTokenStore，JdbcTokenStore，jwtTokenStore
         * 1、InMemoryTokenStore:这个是OAuth2默认采用的实现方式。在单服务上可以体现出很好特效（即并发量不大，
         * 并且它在失败的时候不会进行备份），大多项目都可以采用此方法。根据名字就知道了，是存储在内存中，毕竟存在内存，
         * 而不是磁盘中，调试简易
         * 2、JdbcTokenStore：这个是基于JDBC的实现，令牌（Access Token）会保存到数据库。这个方式，可以在多个服务之间实现令牌共享
         * 使用此种方法，默认需要两张表：oauth_access_token，oauth_refresh_token
         * 3、jwtTokenStore：jwt全称 JSON Web Token。这个实现方式不用管如何进行存储（内存或磁盘），因为它可以把相关
         * 信息数据编码存放在令牌里，既然jwt是将信息存放在令牌中，那么就得考虑其安全性，因此，OAuth2提供了
         * JwtAccessTokenConverter实现，添加jwtSigningKey，以此生成秘钥，以此进行签名，只有jwtSigningKey才能获取信息
         *
         */
        return new JwtTokenStore(accessTokenConverter());
    }
    @Bean
    public JwtAccessTokenConverter accessTokenConverter(){
        /**
         * JwtAccessTokenConverter:Helper that translates between JWT encoded token values and
         * OAuth authentication information (in both directions). Also acts as a TokenEnhancer
         * when tokens are granted.
         * 在JWT编码的令牌值和OAuth身份验证信息（双向）之间转换的帮助程序。在授予令牌时，还充当令牌增强程序。
         */
        JwtAccessTokenConverter converter=new JwtAccessTokenConverter();
        converter.setSigningKey(SIGNING_KEY);//对称密钥，资源服务器使用该密钥来验证
        return converter;
    }


}
